package gui.tables;

//import gui.tables.JTableHeaderCheckBox.MyItemListener;

import java.awt.BorderLayout;
import java.io.IOException;
import java.util.Collections;
import java.util.List;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

import org.jdom.JDOMException;

import start.Config;

import xml.XMLCategoryReader;
import xml.XMLCategorySaver;

/**
 * Checkbox-Tabelle fuer Kategorien
 * @author dennis-wittkoetter
 *
 */
public class CategoryTable extends JTableHeaderCheckBox {
	/** alle Spaltennamen der Tabelle (Spalte 1 = Checkbox-Status) */
	private static Object[] colNames = { "Name" };
	/** Checkbox aus Tabellen-Header nicht gesetzt */
	private static boolean isSetCheckBox = false;
	
	/**
	 * Konstruiert eine Tabelle fuer das "Kategorie hinzufuegen"-Panel.
	 * Der Konstruktor der Oberklasse erstellt dabei eine Tabelle mit Checkbox-Spalte und "Name"-Spalte
	 */
	public CategoryTable() {
		super(colNames);
		dtm = new DefaultTableModel(data, columnNames) {
			private static final long serialVersionUID = 1L;

			@Override public boolean isCellEditable(int row, int col) {
		        if (col > 0) return false;
		        return true;
		    }
		    
		};
		table = new JTable(dtm);
	}
	
	/**
	 * Schreibt den Tabelleninhalt auf Basis einer XML mit Kategorie-Inhalten neu
	 * @param xml	XML-Reader fuer Kategorien
	 * @return 'true' wenn erfolgreich, 'false' wenn fehlgeschlagen (XML leer)
	 * @throws JDOMException 
	 * @throws IOException 
	 */
	public boolean updateFromXML(XMLCategoryReader xml) throws IOException, JDOMException {
		Object[] data = new Object[2];		//Zwischenspeicher fuer XML-Inhalte
		List<String> content = xml.convertToTable();		//XML-Inhalt in Liste schreiben
		Collections.sort(content);
		dtm.setRowCount(0);		//alten Tabelleninhalt loeschen
		if (content.isEmpty())	return false;
		
		//Kategorien auslesen und zeilenweise in Tabelle schreiben
		for(int i=0; i<content.size(); i++){
			data[0] = isSetCheckBox;	//Checkbox nicht abgehakt
			data[1] = content.get(i).toString();
			dtm.addRow(data);
		}
		content.clear();	//Liste loeschen
		
		return true;
	}
	@Override public JPanel buildPanel() {
		//Spalten konfigurieren:
	    //Checkbox-Spalte ist 25px breit, fix und nicht veraenderbar 
	    table.getColumnModel().getColumn(0).setPreferredWidth(25);
	    table.getColumnModel().getColumn(0).setMaxWidth(25);
	    table.getColumnModel().getColumn(0).setResizable(false);
	    
		JScrollPane sp = new JScrollPane(table);  
	    TableColumn tc = table.getColumnModel().getColumn(0);  
	    tc.setCellEditor(table.getDefaultEditor(Boolean.class));  
	    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));  
	    tc.setHeaderRenderer(new CheckBoxHeader(new MyItemListenerCategory()));
	    
	    JPanel p = new JPanel(new BorderLayout());
	    p.add(sp);
	    return p;
	}
	
	/**
	 * Entfernt alle per Checkbox selektierten Eintraege aus der angegebenen XML
	 * @param xml	Saver-Objekt der zu bearbeitenden XML
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void removeCheckedEntries(XMLCategorySaver xml) throws JDOMException, IOException {
		for(int i=0; i<dtm.getRowCount(); i++) {
			if (dtm.getValueAt(i, 0).toString().equalsIgnoreCase("true")) {
				if (Config.debugMode()) {	//DEBUG
					String str = dtm.getValueAt(i, 1).toString();
					if (Config.debugMode())
						System.out.println(str+" - XML-Index: "+xml.getIndex(str));
				}
				
				xml.remove(dtm.getValueAt(i, 1).toString());
				xml.createXMLFile();
			}
		}
	}
	
	/**
	 * Entfernt die den Eintrag der aktuell ausgewaehlten Zeile in der angegebenen XML
	 * @param xml	Saver-Objekt der zu bearbeitenden XML
	 * @throws IOException
	 * @throws JDOMException
	 */
	public void removeSelectedRow(XMLCategorySaver xml) throws IOException, JDOMException {
		int selRow = table.getSelectedRow();
		
		if (selRow < table.getRowCount()) {
			if (selRow != -1 && this.getCheckedRowCount()==0) {
				xml.remove(dtm.getValueAt(selRow, 1).toString());
				xml.createXMLFile();
			}
		}
	}
	
	/**
	 * Setzt die Checkbox der Kategorien
	 * @param a	Wert zum Setzen der der Checkbox
	 */
	public static void setBool(boolean a) {
		isSetCheckBox = a;
	}
}
